home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
man
/
cat.1
/
perlsyn.1
< prev
next >
Wrap
Text File
|
1995-07-25
|
15KB
|
397 lines
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
NNNNAAAAMMMMEEEE
perlsyn - Perl syntax
DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
A Perl script consists of a sequence of declarations and
statements. The only things that need to be declared in
Perl are report formats and subroutines. See the sections
below for more information on those declarations. All
uninitialized user-created objects are assumed to start with
a null or 0 value until they are defined by some explicit
operation such as assignment. (Though you can get warnings
about the use of undefined values if you like.) The
sequence of statements is executed just once, unlike in sssseeeedddd
and aaaawwwwkkkk scripts, where the sequence of statements is
executed for each input line. While this means that you
must explicitly loop over the lines of your input file (or
files), it also means you have much more control over which
files and which lines you look at. (Actually, I'm lying--it
is possible to do an implicit loop with either the ----nnnn or ----pppp
switch. It's just not the mandatory default like it is in
sssseeeedddd and aaaawwwwkkkk.)
Perl is, for the most part, a free-form language. (The only
exception to this is format declarations, for obvious
reasons.) Comments are indicated by the "#" character, and
extend to the end of the line. If you attempt to use /* */
C-style comments, it will be interpreted either as division
or pattern matching, depending on the context, and C++ //
comments just look like a null regular expression, So don't
do that.
A declaration can be put anywhere a statement can, but has
no effect on the execution of the primary sequence of
statements--declarations all take effect at compile time.
Typically all the declarations are put at the beginning or
the end of the script.
As of Perl 5, declaring a subroutine allows a subroutine
name to be used as if it were a list operator from that
point forward in the program. You can declare a subroutine
without defining it by saying just
sub myname;
$me = myname $0 or die "can't get myname";
Note that it functions as a list operator though, not a
unary operator, so be careful to use or instead of || there.
Subroutines declarations can also be imported by a use
statement.
Also as of Perl 5, a statement sequence may contain
Page 1 (printed 6/30/95)
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
declarations of lexically scoped variables, but apart from
declaring a variable name, the declaration acts like an
ordinary statement, and is elaborated within the sequence of
statements as if it were an ordinary statement.
SSSSiiiimmmmpppplllleeee ssssttttaaaatttteeeemmmmeeeennnnttttssss
The only kind of simple statement is an expression evaluated
for its side effects. Every simple statement must be
terminated with a semicolon, unless it is the final
statement in a block, in which case the semicolon is
optional. (A semicolon is still encouraged there if the
block takes up more than one line, since you may add another
line.) Note that there are some operators like eval {} and
do {} that look like compound statements, but aren't
(they're just TERMs in an expression), and thus need an
explicit termination if used as the last item in a
statement.
Any simple statement may optionally be followed by a _S_I_N_G_L_E
modifier, just before the terminating semicolon (or block
ending). The possible modifiers are:
if EXPR
unless EXPR
while EXPR
until EXPR
The if and unless modifiers have the expected semantics,
presuming you're a speaker of English. The while and until
modifiers also have the usual "while loop" semantics
(conditional evaluated first), except when applied to a do-
BLOCK (or to the now-deprecated do-SUBROUTINE statement), in
which case the block executes once before the conditional is
evaluated. This is so that you can write loops like:
do {
$_ = <STDIN>;
...
} until $_ eq ".\n";
See the do entry in the _p_e_r_l_f_u_n_c manpage. Note also that
the loop control statements described later will _N_O_T work in
this construct, since modifiers don't take loop labels.
Sorry. You can always wrap another block around it to do
that sort of thing.)
CCCCoooommmmppppoooouuuunnnndddd ssssttttaaaatttteeeemmmmeeeennnnttttssss
In Perl, a sequence of statements that defines a scope is
called a block. Sometimes a block is delimited by the file
containing it (in the case of a required file, or the
Page 2 (printed 6/30/95)
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
program as a whole), and sometimes a block is delimited by
the extent of a string (in the case of an eval).
But generally, a block is delimited by curly brackets, also
known as braces. We will call this syntactic construct a
BLOCK.
The following compound statements may be used to control
flow:
if (EXPR) BLOCK
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
LABEL while (EXPR) BLOCK
LABEL while (EXPR) BLOCK continue BLOCK
LABEL for (EXPR; EXPR; EXPR) BLOCK
LABEL foreach VAR (ARRAY) BLOCK
LABEL BLOCK continue BLOCK
Note that, unlike C and Pascal, these are defined in terms
of BLOCKs, not statements. This means that the curly
brackets are _r_e_q_u_i_r_e_d--no dangling statements allowed. If
you want to write conditionals without curly brackets there
are several other ways to do it. The following all do the
same thing:
if (!open(FOO)) { die "Can't open $FOO: $!"; }
die "Can't open $FOO: $!" unless open(FOO);
open(FOO) or die "Can't open $FOO: $!"; # FOO or bust!
open(FOO) ? 'hi mom' : die "Can't open $FOO: $!";
# a bit exotic, that last one
The if statement is straightforward. Since BLOCKs are
always bounded by curly brackets, there is never any
ambiguity about which if an else goes with. If you use
unless in place of if, the sense of the test is reversed.
The while statement executes the block as long as the
expression is true (does not evaluate to the null string or
0 or "0"). The LABEL is optional, and if present, consists
of an identifier followed by a colon. The LABEL identifies
the loop for the loop control statements next, last, and
redo (see below). If there is a continue BLOCK, it is
always executed just before the conditional is about to be
evaluated again, just like the third part of a for loop in
C. Thus it can be used to increment a loop variable, even
when the loop has been continued via the next statement
(which is similar to the C continue statement).
If the word while is replaced by the word until, the sense
of the test is reversed, but the conditional is still tested
before the first iteration.
Page 3 (printed 6/30/95)
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
In either the if or the while statement, you may replace
"(EXPR)" with a BLOCK, and the conditional is true if the
value of the last statement in that block is true. (This
feature continues to work in Perl 5 but is deprecated.
Please change any occurrences of "if BLOCK" to "if (do
BLOCK)".)
The C-style for loop works exactly like the corresponding
while loop:
for ($i = 1; $i < 10; $i++) {
...
}
is the same as
$i = 1;
while ($i < 10) {
...
} continue {
$i++;
}
The foreach loop iterates over a normal list value and sets
the variable VAR to be each element of the list in turn.
The variable is implicitly local to the loop (unless
declared previously with my), and regains its former value
upon exiting the loop. The foreach keyword is actually a
synonym for the for keyword, so you can use foreach for
readability or for for brevity. If VAR is omitted, $_ is
set to each value. If ARRAY is an actual array (as opposed
to an expression returning a list value), you can modify
each element of the array by modifying VAR inside the loop.
Examples:
for (@ary) { s/foo/bar/; }
foreach $elem (@elements) {
$elem *= 2;
}
for ((10,9,8,7,6,5,4,3,2,1,'BOOM')) {
print $_, "\n"; sleep(1);
}
for (1..15) { print "Merry Christmas\n"; }
foreach $item (split(/:[\\\n:]*/, $ENV{'TERMCAP'})) {
print "Item: $item\n";
}
A BLOCK by itself (labeled or not) is semantically
Page 4 (printed 6/30/95)
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
equivalent to a loop that executes once. Thus you can use
any of the loop control statements in it to leave or restart
the block. The continue block is optional. This construct
is particularly nice for doing case structures.
SWITCH: {
if (/^abc/) { $abc = 1; last SWITCH; }
if (/^def/) { $def = 1; last SWITCH; }
if (/^xyz/) { $xyz = 1; last SWITCH; }
$nothing = 1;
}
There is no official switch statement in Perl, because there
are already several ways to write the equivalent. In
addition to the above, you could write
SWITCH: {
$abc = 1, last SWITCH if /^abc/;
$def = 1, last SWITCH if /^def/;
$xyz = 1, last SWITCH if /^xyz/;
$nothing = 1;
}
(That's actually not as strange as it looks one you realize
that you can use loop control "operators" within an
expression, That's just the normal C comma operator.)
or
SWITCH: {
/^abc/ && do { $abc = 1; last SWITCH; };
/^def/ && do { $def = 1; last SWITCH; };
/^xyz/ && do { $xyz = 1; last SWITCH; };
$nothing = 1;
}
or formatted so it stands out more as a "proper" switch
statement:
SWITCH: {
/^abc/ && do {
$abc = 1;
last SWITCH;
};
/^def/ && do {
$def = 1;
last SWITCH;
};
Page 5 (printed 6/30/95)
PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV ((((RRRReeeelllleeeeaaaasssseeee 0000....0000 PPPPaaaattttcccchhhhlllleeeevvvveeeellll 00000000)))) PPPPEEEERRRRLLLLSSSSYYYYNNNN((((1111))))
/^xyz/ && do {
$xyz = 1;
last SWITCH;
};
$nothing = 1;
}
or
SWITCH: {
/^abc/ and $abc = 1, last SWITCH;
/^def/ and $def = 1, last SWITCH;
/^xyz/ and $xyz = 1, last SWITCH;
$nothing = 1;
}
or even, horrors,
if (/^abc/)
{ $abc = 1 }
elsif (/^def/)
{ $def = 1 }
elsif (/^xyz/)
{ $xyz = 1 }
else
{ $nothing = 1 }
Page 6 (printed 6/30/95)